package pe.com.bbva.efcap.servidor.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import pe.com.bbva.efcap.servidor.bean.IndicadorBean;
import pe.com.bbva.efcap.servidor.bean.PeriodoCuentaBean;
import pe.com.bbva.efcap.servidor.bean.ValoresBean;
import pe.com.bbva.efcap.servidor.servicio.DetalleSimulacionService;
import pe.com.bbva.efcap.servidor.servicio.IndicadorService;
import pe.com.bbva.efcap.servidor.util.Constante;
import pe.com.bbva.efcap.servidor.util.Reporteador;

@Component("proyeccionMB")
@Scope("request")
public class ProyeccionController implements Serializable {

	private static final long serialVersionUID = 1L;
	private static final Logger LOGGER = LoggerFactory.getLogger(ProyeccionController.class);

	@Autowired
	private IndicadorService indicadorService;

	@Autowired
	private DetalleSimulacionService detSimulac;

	private Integer simulationCode;	
	private List<IndicadorBean> indicadorListBG;
	private List<PeriodoCuentaBean> detalleListProyeccionBG;
	private List<IndicadorBean> indicadorListEGYP;
	private List<PeriodoCuentaBean> detalleListProyeccionEGYP;
	private List<IndicadorBean> indicadorListRatio;
	private List<PeriodoCuentaBean> detalleListProyeccionRatio;
	private String pestana = (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("pestana");
	
	@PostConstruct
	public void init() {
		try{
			indicadorListBG = new ArrayList<IndicadorBean>();
			listarIndicadorBG();
			detalleListProyeccionBG = new ArrayList<PeriodoCuentaBean>();
			listarDetalleProyeccionBG();
			indicadorListEGYP = new ArrayList<IndicadorBean>();
			listarIndicadorEGYP();
			detalleListProyeccionEGYP = new ArrayList<PeriodoCuentaBean>();
			listarDetalleProyeccionEGYP();
			indicadorListRatio = new ArrayList<IndicadorBean>();
			listarIndicadorRatio();
			detalleListProyeccionRatio = new ArrayList<PeriodoCuentaBean>();
			listarProyeccionRatio();
		} catch (Exception e) {
			LOGGER.error("ProyeccionController -> init" + e.getMessage(), e);
		}
	}

	public Integer getSimulationCode() {
		simulationCode = 1;
		return simulationCode;
	}

	public void setSimulationCode(Integer simulationCode) {
		this.simulationCode = simulationCode;
	}

	public List<IndicadorBean> getIndicadorListBG() {
		return indicadorListBG;
	}

	public void setIndicadorListBG(List<IndicadorBean> indicadorListBG) {
		this.indicadorListBG = indicadorListBG;
	}

	public List<PeriodoCuentaBean> getDetalleListProyeccionBG() {
		return detalleListProyeccionBG;
	}

	public void setDetalleListProyeccionBG(List<PeriodoCuentaBean> detalleListProyeccionBG) {
		this.detalleListProyeccionBG = detalleListProyeccionBG;
	}
	
	public IndicadorService getIndicadorService() {
		return indicadorService;
	}

	public void setIndicadorService(IndicadorService indicadorService) {
		this.indicadorService = indicadorService;
	}

	public DetalleSimulacionService getDetSimulac() {
		return detSimulac;
	}

	public void setDetSimulac(DetalleSimulacionService detSimulac) {
		this.detSimulac = detSimulac;
	}

	public List<IndicadorBean> getIndicadorListEGYP() {
		return indicadorListEGYP;
	}
	
	public void setIndicadorListEGYP(List<IndicadorBean> indicadorListEGYP) {
		this.indicadorListEGYP = indicadorListEGYP;
	}

	public List<PeriodoCuentaBean> getDetalleListProyeccionEGYP() {
		return detalleListProyeccionEGYP;
	}

	public void setDetalleListProyeccionEGYP(
			List<PeriodoCuentaBean> detalleListProyeccionEGYP) {
		this.detalleListProyeccionEGYP = detalleListProyeccionEGYP;
	}

	public List<IndicadorBean> getIndicadorListRatio() {
		return indicadorListRatio;
	}
	
	public void setIndicadorListRatio(List<IndicadorBean> indicadorListRatio) {
		this.indicadorListRatio = indicadorListRatio;
	}

	public List<PeriodoCuentaBean> getDetalleListProyeccionRatio() {
		return detalleListProyeccionRatio;
	}

	public void setDetalleListProyeccionRatio(
			List<PeriodoCuentaBean> detalleListProyeccionRatio) {
		this.detalleListProyeccionRatio = detalleListProyeccionRatio;
	}

	public void listarIndicadorBG(){
		indicadorListBG = indicadorService.obtenerListaIndicadoresPorCatalogo(Constante.BALANCE_GENERAL);
	}

	public void listarDetalleProyeccionBG() {
		detalleListProyeccionBG = detSimulac.getSimulacionProyeccion(getSimulationCode(), Constante.BALANCE_GENERAL);
	}
	
	public void listarIndicadorEGYP(){
		indicadorListEGYP = indicadorService.obtenerListaIndicadoresPorCatalogo(Constante.ESTADO_PERDIDAS_GANANCIAS);
	}

	public void listarDetalleProyeccionEGYP(){
		detalleListProyeccionEGYP = detSimulac.getSimulacionProyeccion(getSimulationCode(), Constante.ESTADO_PERDIDAS_GANANCIAS);
	}
	
	public void listarIndicadorRatio(){
		indicadorListRatio = indicadorService.obtenerListaIndicadoresPorCatalogo(Constante.RATIOS);
	}

	public void listarProyeccionRatio(){
		detalleListProyeccionRatio = detSimulac.getSimulacionProyeccion(getSimulationCode(), Constante.RATIOS);
	}
	
	public void guardarProyeccion(){
		//TODO: mostrando data - quitar
		System.out.println(pestana);
		for(PeriodoCuentaBean p : detalleListProyeccionBG){
			System.out.println("periodoBG:  " + p.getPeriodo() + " ** ");
			for(ValoresBean v : p.getIndicadores()){
				System.out.println("valorBG: " + v.getValor());
			}
		}		
	}
	
	public void generarPDF(){
		List<PeriodoCuentaBean> listaReporte = null;
		//listaReporte = clone(detalleListProyeccionBG);
		try {
			LOGGER.info("ProyeccionController -> generarPDF");
//			private List<IndicadorBean> listaReporte;
//			private List<PeriodoCuentaBean> detalleListProyeccionBG;
//			private List<IndicadorBean> indicadorListEGYP;
//			private List<PeriodoCuentaBean> detalleListProyeccionEGYP;
//			private List<IndicadorBean> indicadorListRatio;
//			private List<PeriodoCuentaBean> detalleListProyeccionRatio;
			Reporteador reporteador = new Reporteador();
			ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();				
			String ruta = servletContext.getRealPath("/");
			String path = servletContext.getRealPath("");
			reporteador.generaPDFSistema("ReporteSistemas", ruta, path, listaReporte);
			
		} catch (Exception e) {
			LOGGER.error("ProyeccionController -> generarPDF" + e.getMessage(), e);
		}		
	}
	
	public void generarExcel() {
		try{
			LOGGER.info("ProyeccionController -> generarExcel");
			Reporteador reporteador = new Reporteador();
			ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			String ruta = servletContext.getRealPath("/");
			reporteador.generaExcelSistema("ReporteSistemas", ruta, detalleListProyeccionBG);
		} catch (Exception e) {
			LOGGER.error("ProyeccionController -> generarExcel" + e.getMessage(), e);
		}
    }
	

}
